المدخلات


الأدخال من خلال المستخدم

يستخدم عند كتابة البرنامج فمثلاً نريد ان يقوم المستخدم بإدخال قيمة أو نص من لوحة المفاتيح، وهنالك عدة طرق للادخال :

باستخدام STDIN

هي عملية ادخال للبيانات فعلى سبيل المثال

#!/usr/bin/perl -w 
#STDIN Method 
print "Hi, what is your name?: "; 
$L1 = <STDIN>; 
chomp $L1; 
print "Nice to meet you $L1!\n";

يمكن استعمال الدالة chop بدلاً من chomp ،الفرق بين الدلتين chomp تقوم بحذف السطر الجديد للنصوص ، بينما chop نفس السابقة لكن تقوم بحذف الحرف الاخير سواء كان حرف او سطر جديد .



الطريقة الثانية للادخال باستخدام المصفوفة الخاصة ARGV@ :


هذة ليست مصفوفة عادية @ARGV بها يمكنك ان تضع المستخدم على عدة خيارات فمثلاً

perl sploit.pl www.somesite.com /forums/ 1

جميع هذة الخيارات يمكن ان تعدل ماعدا ( perl sploit.pl ) ، في اغلب الاوقات مانسخدم الخيارات بالطريقة ARGV@

#!/usr/bin/perl -w 
if(@ARGV !=2) { 
print "Usage: perl $0 <name> <number>\n"; 
exit; 
} 
($name, $num) = @ARGV; 
print "Hello $name & your number was: $num!\n";

$0 يستخدم هذا المتغير للأخذ اسم الملف file.pl المنفذ حالياً ويتم طباعتة في المعلومات المخرجة ,exit تقوم باخروج من البرنامج ومن الممكن اعادة كتابتها بواسطة الدالة die للخروج مع الانتهاء برسالة

die "Usage: $0 <name> <number>\n" unless @ARGV == 2;
#!/usr/bin/perl -w
unless(@ARGV==4 and $ARGV[0] eq "-n" and $ARGV[2] eq "-f") {
die "Usage: $0 -n <name> -f <number>\n"; 
}
print "Hello $ARGV[1] & your number was: $ARGV[3]!\n";


الطريقة الثالثة باستخدام الموديل المسمى GetOpt :


#!/usr/bin/perl -w 
#GetOpt STD module 
use Getopt::Std; 
getopts (":b:n:", \%args); 
if (defined $args{n}) { 
$n1 = $args{n}; 
} 
if (defined $args{b}) { 
$n2 = $args{b}; 
} 
if (!defined $args{n} or !defined $args{b}){ 
print "Usage: perl $0 -n Name -b Number\n"; 
exit; 
} 
print "Hello $n1!\n"; 
print "Your number was: $n2\n"; 

ففي المثال في السطر الثالث استدعاء الموديل المسماه Getopt وفي السطر الرابع getopts لها الأعلام -b,-n ، واستخدام مرجع هاش لتخزينهم %args وفي السطر الخامس هنا اذا كان العلام n معرف defined يدخل في السطر السادس لخزن المعلومات في المتغير n1 ،ولن يدخل الا اذا كان العلام nموجود . ونفس الشيء مع العلام b وفي السطر الحادي عشر هنا يحدد الشرط اذا كان غير معرفة الأعلام ، سيدخل ويغلق البرنامج بالتعليمة exit (يمكن استعمال الدالة undef بدلاً من !defined )،تذكر orكلها صائبة الا في حاله واحدة خاطئه في لحالة هي معرف n ومعرف b ،ثم في الاخير يقوم بطبعه المتغيرات والنصوص .

التحويل بين الأعداد الصحيحة والحقيقية والنصوص :

تحويل النصوص الى اوطأ مستوى Low-Level:

لتحويل النصوص الى المستويات الاوطئ تؤفر البيرل ثلاث دوال ، يمكن لدالتين pack and unpack تحول بين النصوص و والقيم كما تعمل الدالة sprintf المتوطة المستوى ، وتسمح الدالة vec بمعالجة النصوص كما لو كانت القيم في الميزان الثنائي



Pack and Unpack

تحول كلا الدالتين بين النصوص وقيم القوائم :تأخذ الدالة pack الformat او النصوص المؤقتة (format or template string )، وقيم القوائم تعيد النصوص التي تحتوي شكل الضغط من هذة القيم . اما الدالة unpack تاخذ نفس ال format string وتفك ضغط وتعيد شكل القيم الاصلية . pack تشبة sprintf فكليهما ياخذان format string وقائمة من القيم ، وتخرجن في الخرج ناتج كانصوص .ان الاختلاف ان sprintf مهتمة بتحويل القيم الى نصوص واضحة legible strings ، بينهما pack مهتمة بانتاج نصوص بتمثيل بايت بواسطة بايت byte-by-byte string من القيم المدخله لها ، بينما sprintf تعيد العدد الصحيح بشكل نصي ، فعلى سبيل المثال الدالة pack سوف تحول العدد الصحيح الى القيمة الثنائية ثم اعادة مجموعة من الحروف مع المجموعة الصحيحة لجدول ASCII .

$integer=97;
$string = pack 'i', $integer;
print $string;   # produces 'a'

فالـ format string مختلف عن صيغة الدالة sprintf بواسطة واحد format stringالتي قد تاخذ اكثر من حرف عند معالجة $integer باكثر من قيمة صحيحة ، فاعديد منهم تسمح لنا بتحويل العديد من القيم او بيانات مختلطة الى على نص واحد ، وباستعمال نفس الformat لعمل unpack لاحقاً لإستراجاع القيم الصلية .

print unpack 'i', $string;

بالرغم من ان الدالتين pack and unpack تعملان لكن طلب البايتات الخارجة تعتمد على الهندسة المعمارية للمعالج processor architecture . فالـV يعمل كالقالب i لكن الاعداد الصحيحة التي تضغط packs “little-endian”بعض النظر عن النظام التشغيل لديك .فهنا سنستعمل الـ V ومع عدد صحيح فقد يظهر

print pack 'V', 1819436368;   # produces the string 'Perl' (not 'lerP')

فعند تحويل الرقم باهكس من خلال الدالة hex

print hex("1819436368");

وهذا بسبب ان العدد العشري الغامض يمثل بالـ32-bit التي هي 4 بايت ، .......لم يحدث شيء ولعمل pack مع العديد من العناصر من الاعداد الصحيحة يمكن وضعه مع استعمال عداد التكرارات هنا 4

$string = pack 'i4', @integers[0..3];

لعمل pack في العديد من عناصر كالمصفوفة باستعمال عداد التكرار *

$string = pack 'i*', @integers;

$string = pack 'i4xZ10', @integers[0..3], "abcdefghijklmnop";


الحرف الخصائص
a Arbitrary (presumed string) data, null padded if too short
A Arbitrary (presumed string) data, space padded if too short
B Bit string, descending order
b Bit string, ascending order (as used by vec)
c Signed character (8-bit) value
C Unsigned character (8-bit) value
d Double precision (64-bit) floating-point number
D Long double precision (96-bit) floating-point number (Perl 5.8 onwards)
f Single precision floating-point number
F Perl internal floating-point number type, NV (Perl 5.8 onwards)
h Hex string, byte order low-high
H Hex string, byte order high-low
i Signed integer value (length dependent on C)
I Unsigned integer value (length dependent on C)
j Perl internal integer number type, IV (Perl 5.8 onwards)
J Perl internal unsigned number type, UV (Perl 5.8 onwards)
l Signed long (32-bit) value
L Unsigned long (32-bit) value
n Unsigned short, big-endian (network) order
N Unsigned long, big-endian (network) order
p Pointer to null terminated string
P Pointer to fixed-length string
q Signed quad/long long (64-bit) value
Q Unsigned quad/long long (64-bit) value
s Signed short (16-bit) value
S Unsigned short (16-bit) value
u Unencoded string
U Unicode character
v Unsigned short, little-endian (VAX) order
V Unsigned long, little-endian (VAX) order
w BER (base 128) compressed integer
x Null/ignore byte
X Backup a byte
Z Null terminated string
@ Fill with nulls to absolute position (must be followed by a number)